package com.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.entity.Document;
import com.entity.StoreHouse;
import com.entity.base.Result;
import com.mapper.DocumentMapper;
import com.mapper.StoreHouseMapper;
import com.service.DocumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


@Service
public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, Document> implements DocumentService {

    @Autowired
    DocumentMapper documentMapper;

    @Autowired
    StoreHouseMapper storeHouseMapper;

    @Override
    public List<Document> treeList() {
        List<Document> data = documentMapper.selectList(null);
        List<Document> documentList = new ArrayList<>();
        for(Document document : data){
            if(document.getSuperId() == 0){
                documentList.add(document);
            }
        }
        for(Document file : documentList){
            file.setDocumentList(getChilde(file.getId(), data));
        }
        return documentList;
    }

    @Override
    public List<Document> getChilde(Long id, List<Document> rootList) {
        //子菜单
        List<Document> childList = new ArrayList<>();
        for(Document document : rootList){
            if(document.getSuperId()==id){
                childList.add(document);
            }
        }
        for(Document document : childList){
            document.setDocumentList(getChilde(document.getId(), rootList));
        }
        if (childList.size() == 0){
            return null;
        }
        return childList;
    }
    @Override
    public void remakeDocument() {
        List<Document> data = documentMapper.selectList(null);
        for (int i=0;i<data.size();i++){
            if (documentMapper.selectById(data.get(i).getSuperId())==null&&data.get(i).getSuperId()!=0){
                documentMapper.deleteById(data.get(i).getId());
            }
        }
    }

//    @Override
//    public Document getById(Serializable id) {
//        Document t = documentMapper.selectById(id);
//        QueryWrapper<Document> wrapper = new QueryWrapper<>();
//        wrapper.eq("supde_id", id);
//        List documentList = documentMapper.selectList(wrapper);
//        t.setDocumentList(documentList);
//        return t;
//    }

    /**
     *  根据路径删除指定的目录或文件，无论存在与否
     *@param sPath  要删除的目录或文件
     *@return 删除成功返回 true，否则返回 false。
     */
    @Override
    public boolean deleteFolder(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        // 判断目录或文件是否存在
        if (!file.exists()) {  // 不存在返回 false
            return false;
        } else {
            // 判断是否为文件
            if (file.isFile()) {  // 为文件时调用删除文件方法
                return deleteFile(sPath);
            } else {  // 为目录时调用删除目录方法
                return deleteDirectory(sPath);
            }
        }
    }

    /**
     * 删除单个文件
     * @param   sPath    被删除文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public boolean deleteFile(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

    /**
     * 删除目录（文件夹）以及目录下的文件
     * @param   sPath 被删除目录的文件路径
     * @return  目录删除成功返回true，否则返回false
     */
    public boolean deleteDirectory(String sPath) {
        //如果sPath不以文件分隔符结尾，自动添加文件分隔符
        if (!sPath.endsWith(File.separator)) {
            sPath = sPath + File.separator;
        }
        File dirFile = new File(sPath);
        //如果dir对应的文件不存在，或者不是一个目录，则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        boolean flag = true;
        //删除文件夹下的所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            //删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) break;
            } //删除子目录
            else {
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag) break;
            }
        }
        if (!flag) return false;
        //删除当前目录
        if (dirFile.delete()) {
            return true;
        } else {
            return false;
        }
    }
    @Override
    public Result uploadFile(MultipartFile avatorFile,Document document){
        if(avatorFile.isEmpty()){
            return Result.error("文件上传失败");
        }
        StoreHouse storeHouse = storeHouseMapper.selectById(document.getStoreHouseId());
        double fileCapacity = avatorFile.getSize();
        if (storeHouse.getTCapacity()-fileCapacity<0){
            return Result.error("资源库空间不足");
        }
        document.setName(avatorFile.getOriginalFilename());
        //文件名=当前时间到毫秒+原来的文件名
        String fileName = System.currentTimeMillis()+avatorFile.getOriginalFilename();
        String storeHousePath = storeHouse.getPath();
        String filePath = System.getProperty("user.dir")+storeHousePath;
        //如果文件路径不存在，新增该路径
        File file1 = new File(filePath);
        if(!file1.exists()){
            file1.mkdir();
        }
        //实际的文件地址
        File dest = new File(filePath+System.getProperty("file.separator")+fileName);
        //存储到数据库里的相对文件地址
        String storeAvatorPath = storeHousePath+"/"+fileName;
        try {
            avatorFile.transferTo(dest);
            document.setPath(storeAvatorPath);
            document.setCapacity(fileCapacity);
            storeHouse.setUCapacity(storeHouse.getUCapacity()+fileCapacity);
            storeHouse.setRCapacity(storeHouse.getTCapacity()-fileCapacity);
            int flag = this.documentMapper.insert(document);
            if(flag!=0){
                return Result.success(storeAvatorPath);
            }
            return Result.error("上传失败");
        } catch (IOException e) {
            return Result.error("上传失败 "+e.getMessage());
        }
    }
}
